19622
545
¿Quieres mejorar esta publicación? Proporcione respuestas detalladas a esta pregunta, incluidas las citas y una explicación de por qué su respuesta es correcta. Las respuestas sin suficientes detalles se pueden editar o eliminar.
Agregué archivos por error a Git usando el comando:
git agregar myfile.txt
Todavía no he ejecutado git commit. ¿Hay alguna forma de deshacer esto para que estos archivos no se incluyan en la confirmación? 
1
2
Siguiente
Puede deshacer git add antes de confirmar con
git reset 
que lo eliminará del índice actual (la lista "a punto de confirmarse") sin cambiar nada más.
Puedes usar
git reset
sin ningún nombre de archivo para eliminar todos los cambios debidos. Esto puede resultar útil cuando hay demasiados archivos para enumerarlos uno por uno en un período de tiempo razonable.
En versiones antiguas de Git, los comandos anteriores son equivalentes a git reset HEAD  y git reset HEAD respectivamente, y fallarán si HEAD no está definido (porque aún no ha realizado ninguna confirmación en su repositorio) o ambiguo ( creó una rama llamada HEAD, que es una estupidez que no debería hacer). Sin embargo, esto se cambió en Git 1.8.2, por lo que en las versiones modernas de Git puede usar los comandos anteriores incluso antes de realizar su primera confirmación:
"git reset" (sin opciones ni parámetros) utilizado para error cuando
no tiene ninguna confirmación en su historial, pero ahora le da
un índice vacío (para que coincida con el compromiso inexistente en el que ni siquiera estás).
Documentación: git reset
|
Usted quiere:
git rm --cached 
Razonamiento:
Cuando era nuevo en esto, primero intenté
git reset.
(para deshacer toda mi adición inicial), solo para obtener este (no tan) útil mensaje:
fatal: No se pudo resolver 'HEAD' como una ref. válida.
Resulta que esto se debe a que la referencia HEAD (¿rama?) No existe hasta después de la primera confirmación. Es decir, se encontrará con el mismo problema de principiante que yo si su flujo de trabajo, como el mío, fuera algo como:
cd a mi nuevo directorio de proyectos para probar Git, el nuevo hotness
git init
git add.
estado de git
... un montón de pergaminos de mierda por ...
=> Maldita sea, no quería agregar todo eso.
google "deshacer git add"
=> encontrar Stack Overflow - yay
git reset.
=> fatal: No se pudo resolver 'HEAD' como una referencia válida.
Además, resulta que hay un error registrado contra la inutilidad de esto en la lista de correo.
Y que la solución correcta estaba ahí en la salida de estado de Git (que, sí, pasé por alto como 'basura')
...
# Cambios a comprometer:
# (use "git rm --cached  ..." para quitar el escenario)
...
Y la solución es usar git rm --cached FILE.
Tenga en cuenta las advertencias en otros lugares aquí: git rm elimina su copia de trabajo local del archivo, pero no si usa --cached. Aquí está el resultado de git help rm:
- en caché
Utilice esta opción para desestandarizar y eliminar rutas solo del índice.
Se dejarán los archivos de árbol de trabajo, modificados o no.
Procedo a usar
git rm --cached.
para eliminar todo y empezar de nuevo. Sin embargo, no funcionó, porque mientras se agrega. es recursivo, resulta que rm necesita -r para recurrir. Suspiro.
git rm -r --cached.
Bien, ahora he vuelto a donde empecé. La próxima vez voy a usar -n para hacer un ensayo y ver qué se agregará:
git add -n.
Cerré la cremallera de todo en un lugar seguro antes de confiar en git help rm acerca de que --cached no destruye nada (y qué pasa si lo escribo mal).
|
Si escribe:
estado de git
Git te dirá lo que se escenifica, etc., incluidas las instrucciones sobre cómo desactivarlo:
use "git reset HEAD  ..." para quitar el escenario
Encuentro que Git hace un buen trabajo al animarme a hacer lo correcto en situaciones como esta.
Nota: Las versiones recientes de Git (1.8.4.x) han cambiado este mensaje:
(use "git rm --cached  ..." para quitar el escenario)
|
Para aclarar: git add mueve los cambios del directorio de trabajo actual al área de preparación (índice).
Este proceso se llama estadificación. Entonces, el comando más natural para organizar los cambios (archivos modificados) es el obvio:
etapa git
git add es solo un alias más fácil de escribir para git stage
Lástima que no haya comandos git unstage ni git unadd. El relevante es más difícil de adivinar o recordar, pero es bastante obvio:
git reset HEAD -
Podemos crear fácilmente un alias para esto:
git config --global alias.unadd 'restablecer HEAD -'
git config --global alias.unstage 'reset HEAD -'
Y finalmente, tenemos nuevos comandos:
git agregar archivo1
git stage file2
git unadd file2
git unstage file1
Personalmente utilizo alias aún más cortos:
git a # para la puesta en escena
git u # Para quitar la escena
|
Además de la respuesta aceptada, si su archivo agregado por error era enorme, probablemente notará que, incluso después de eliminarlo del índice con 'git reset', todavía parece ocupar espacio en el directorio .git.
Esto no es nada de qué preocuparse; de hecho, el archivo todavía está en el repositorio, pero solo como un "objeto suelto". No se copiará en otros repositorios (mediante clonación, inserción) y el espacio se recuperará eventualmente, aunque quizás no muy pronto. Si está ansioso, puede ejecutar:
git gc --prune = ahora
Actualización (lo que sigue es mi intento de aclarar alguna confusión que puede surgir de las respuestas más votadas):
Entonces, ¿cuál es el verdadero deshacer de git add?
git reset HEAD ?
o
git rm --cached ?
Estrictamente hablando, y si no me equivoco: ninguno.
git add no se puede deshacer, de forma segura, en general.
Recordemos primero lo que realmente hace git add :
Si  no se rastreó previamente, git add lo agrega ala caché, con su contenido actual.
Si ya se realizó un seguimiento de , git add guarda el contenido actual (instantánea, versión) en el caché. En Git, esta acción todavía se llama agregar, (no simplemente actualizarlo), porque dos versiones diferentes (instantáneas) de un archivo se consideran dos elementos diferentes: por lo tanto, estamos agregando un nuevo elemento a la caché, que eventualmente será cometido más tarde.
A la luz de esto, la pregunta es un poco ambigua:
Agregué archivos por error usando el comando ...
El escenario del OP parece ser el primero (archivo sin seguimiento), queremos que "deshacer" elimine el archivo (no solo el contenido actual) de los elementos seguidos. Si este es el caso, entonces está bien ejecutar git rm --cached .
Y también podríamos ejecutar git reset HEAD . En general, esto es preferible, porque funciona en ambos escenarios: también deshace cuando agregamos incorrectamente una versión de un elemento ya rastreado.
Pero hay dos salvedades.
Primero: hay (como se señaló en la respuesta) solo un escenario en el que git reset HEAD no funciona, pero git rm --cached sí: un nuevo repositorio (sin confirmaciones). Pero, en realidad, este es un caso prácticamente irrelevante.
Segundo: tenga en cuenta que git reset HEAD no puede recuperar mágicamente el contenido del archivo previamente almacenado en caché, simplemente lo resincroniza desde HEAD. Si nuestro git add equivocado sobrescribió una versión anterior no confirmada, no podemos recuperarla. Por eso, estrictamente hablando, no podemos deshacer [*].
Ejemplo:
$ git init
$ echo "versión 1"> archivo.txt
$ git agregar archivo.txt # Primero agregar archivo.txt
$ git commit -m 'primer compromiso'
$ echo "versión 2"> file.txt
$ git add file.txt # Stage (no confirmar) "versión 2" de file.txt
$ git diff - archivo en caché.txt
-versión 1
+ versión 2
$ echo "versión 3"> file.txt
$ git diff file.txt
-versión 2
+ versión 3
$ git add file.txt # Vaya, no queríamos decir esto
$ git reset HEAD file.txt # ¿Deshacer?
$ git diff --cached file.txt # No dif, por supuesto. etapa == HEAD
$ git diff file.txt # Hemos perdido irrevocablemente la "versión 2"
-versión 1
+ versión 3
Por supuesto, esto no es muy crítico si solo seguimos el flujo de trabajo lento habitual de hacer 'git add' solo para agregar nuevos archivos (caso 1), y actualizamos nuevos contenidos a través del comando commit, git commit -a.
* (Editar: lo anterior es prácticamente correcto, pero aún puede haber algunas formas un poco intrincadas / complicadas de recuperar cambios que se realizaron, pero no se confirmaron y luego se sobrescribieron; consulte los comentarios de Johannes Matokic e iolsmit)
|
Deshacer un archivo que ya se ha agregado es bastante fácil con Git. Para restablecer myfile.txt, que ya se ha agregado, use:
git reset HEAD myfile.txt
Explicación:
Después de organizar los archivos no deseados, para deshacerlos, puede hacer git reset. Head es el encabezado de su archivo en el local y el último parámetro es el nombre de su archivo.
He creado los pasos en la imagen a continuación con más detalles para usted, incluidos todos los pasos que pueden ocurrir en estos casos:
|
git rm --cached. -r
"des-agregará" todo lo que ha agregado de su directorio actual de forma recursiva
|
correr
git gui
y elimine todos los archivos manualmente o seleccionándolos todos y haciendo clic en el botón quitar la etapa de confirmación.
|
La pregunta no está claramente planteada. La razón es que git add tiene dos significados:
agregando un nuevo archivo al área de ensayo, luego deshaga con git rm --cached file.
agregando un archivo modificado al área de ensayo, luego deshaga con git reset HEAD file.
En caso de duda, utilice
git restablecer archivo HEAD
Porque hace lo esperado en ambos casos.
Advertencia: si hace git rm --cached file en un archivo que fue modificado (un archivo que existía antes en el repositorio), entonces el archivo se eliminará en git commit. Seguirá existiendo en su sistema de archivos, pero si alguien más extrae su confirmación, el archivo se eliminará de su árbol de trabajo.
git status le dirá si el archivo era un archivo nuevo o modificado:
En el maestro de la sucursal
Cambios a comprometer:
(use "git reset HEAD  ..." para quitar el escenario)
nuevo archivo: my_new_file.txt
modificado: my_modified_file.txt
|
Git tiene comandos para cada acción imaginable, pero necesita un conocimiento extenso para hacer las cosas bien y por eso es contraintuitivo en el mejor de los casos ...
Lo que hiciste antes:
Cambió un archivo y usó git add., O git add .
Lo que quieras:
Elimine el archivo del índice, pero manténgalo versionado y deje los cambios sin confirmar en la copia de trabajo:
git reset HEAD 
Restablezca el archivo al último estado de HEAD, deshaciendo los cambios y eliminándolos del índice:
# Piense en `svn revert ` IIRC.
git reset HEAD 
git checkout 
# Si tiene una `` denominada como ``, use:
git checkout - 
Esto es necesario ya que git reset --hard HEAD no funcionará con archivos individuales.
Elimine  del índice y el control de versiones, manteniendo el archivo sin versión con cambios en la copia de trabajo:
git rm --cached 
Elimine  de la copia de trabajo y el control de versiones por completo:
git rm 
|
Si está en su compromiso inicial y no puede usar gitreiniciar, simplemente declare "Git en bancarrota" y elimine la carpeta .git y comience de nuevo
|
Según muchas de las otras respuestas, puede usar git reset
PERO:
Encontré esta pequeña publicación que en realidad agrega el comando Git (bueno, un alias) para git unadd: vea git unadd para más detalles o ..
Simplemente,
git config --global alias.unadd "restablecer HEAD"
Ahora usted puede
git unadd foo.txt bar.txt
|
Use git add -i para eliminar los archivos recién agregados de su próxima confirmación. Ejemplo:
Agregar el archivo que no deseaba:
$ git agregar foo
estado de $ git
# En el maestro de la sucursal
# Cambios a comprometer:
# (use "git reset HEAD  ..." para quitar el escenario)
#
# nuevo archivo: foo
#
# Archivos sin seguimiento:
# (use "git add  ..." para incluir en lo que se confirmará)
# [...] #
Entrar en la adición interactiva para deshacer su adición (los comandos escritos en git aquí son "r" (revertir), "1" (la primera entrada en la lista muestra revertir), 'return' para salir del modo revertir y "q" (dejar):
$ git add -i
camino sin etapas escenificado
1: + 1 / -0 nada foo
*** Comandos ***
1: [s] tatus 2: [u] pfecha 3: [r] evert 4: [a] dd sin seguimiento
5: [p] atch 6: [d] iff 7: [q] uit 8: [h] elp
Que ahora> r
camino sin etapas escenificado
1: + 1 / -0 nada [f] oo
Revertir >> 1
camino sin etapas escenificado
* 1: + 1 / -0 nada [f] oo
Revertir >>
nota: foo no tiene seguimiento ahora.
revirtió un camino
*** Comandos ***
1: [s] tatus 2: [u] pfecha 3: [r] evert 4: [a] dd sin seguimiento
5: [p] atch 6: [d] iff 7: [q] uit 8: [h] elp
Que ahora> q
Adiós.
PS
¡Eso es! Aquí está su prueba, que muestra que "foo" está de vuelta en la lista sin seguimiento:
estado de $ git
# En el maestro de la sucursal
# Archivos sin seguimiento:
# (use "git add  ..." para incluir en lo que se confirmará)
# [...]
# foo
no se agregó nada para confirmar, pero los archivos sin seguimiento están presentes (use "git add" para realizar el seguimiento)
PS
|
git remove o git rm se pueden usar para esto, con el indicador --cached. Tratar:
git help rm
|
Aquí hay una forma de evitar este molesto problema cuando comienza un nuevo proyecto:
Cree el directorio principal para su nuevo proyecto.
Ejecute git init.
Ahora cree un archivo .gitignore (incluso si está vacío).
Confirme su archivo .gitignore.
Git hace que sea realmente difícil hacer git reset si no tiene ninguna confirmación. Si crea una pequeña confirmación inicial solo por el simple hecho de tener una, después de eso, puede agregar -A y restablecer tantas veces como desee para que todo salga bien.
Otra ventaja de este método es que si se encuentra con problemas de final de línea más adelante y necesita actualizar todos sus archivos, es fácil:
Mira ese compromiso inicial. Esto eliminará todos sus archivos.
Luego, revisa tu confirmación más reciente nuevamente. Esto recuperará copias nuevas de sus archivos, utilizando su configuración actual de final de línea.
|
Quizás Git ha evolucionado desde que publicaste tu pregunta.
$> git --version
git versión 1.6.2.1
Ahora puedes probar:
git reset HEAD.
Esto debería ser lo que estás buscando.
|
Tenga en cuenta que si no especifica una revisión, debe incluir un separador. Ejemplo de mi consola:
git reset 
fatal: argumento ambiguo '': revisión desconocida o ruta que no está en el árbol de trabajo.
Use '-' para separar rutas de revisiones
git reset - 
Cambios sin etapas después del reinicio:
M 
(Git versión 1.7.5.4)
|
Para eliminar archivos nuevos del área de preparación (y solo en el caso de un archivo nuevo), como se sugirió anteriormente:
git rm - ARCHIVO en caché
Use rm --cached solo para archivos nuevos agregados accidentalmente.
|
Para restablecer cada archivo en una carpeta en particular (y sus subcarpetas), puede usar el siguiente comando:
git reset *
|
Utilice el comando * para manejar varios archivos a la vez:
git restablecer HEAD * .prj
git restablecer HEAD * .bmp
git reset HEAD * gdb *
etc.
|
Simplemente escriba git reset, se revertirá y es como si nunca hubiera escrito git add. desde tu última confirmación. Asegúrese de haberse comprometido antes.
|
Supongamos que creo un nuevo archivo, newFile.txt:
Supongamos que agrego el archivo accidentalmente, git add newFile.txt:
Ahora quiero deshacer este agregado, antes de confirmar, git reset newFile.txt:
|
Para un archivo específico:
git restablecer my_file.txt
git checkout my_file.txt
Para todos los archivos agregados:
git reset.
git checkout.
Nota: el pago cambia el código en los archivos y pasa al último estado actualizado (confirmado). el reinicio no cambia los códigos; simplemente restablece el encabezado.
|
Para deshacer git add, use:
git restablecer nombre de archivo
|
Este comando eliminará sus cambios:
git restablecer HEAD filename.txt
También puedes usar
git add -p
para agregar partes de archivos.
|
También hay modo interactivo:
git add -i
Elija la opción 3 para anular la adición de archivos. En mi caso, a menudo quiero agregar más de un archivo, y con el modo interactivo puedes usar números como este para agregar archivos. Esto tomará todos menos 4: 1, 2, 3 y 5
Para elegir una secuencia, simplemente escriba 1-5 para tomar todo del 1 al 5.
Archivos de prueba de Git
|
git add myfile.txt # Esto agregará su archivo a la lista de compromisos
Todo lo contrario a este comando es,
git reset HEAD myfile.txt # Esto desharáeso.
entonces, estará en el estado anterior. El especificado volverá a estar en la lista sin seguimiento (estado anterior).
Restablecerá su cabeza con ese archivo especificado. por lo tanto, si su cabeza no tiene ese medio, simplemente lo restablecerá.
|
git restablecer nombre de archivo.txt
Eliminará un archivo llamado filename.txt del índice actual, el área "a punto de ser confirmado", sin cambiar nada más.
|
git restablecer nombre de archivo.txt
Eliminará un archivo llamado filename.txt del índice actual, el área "a punto de confirmarse", sin cambiar nada más.
|
En Sourcetree puede hacer esto fácilmente a través de la GUI.
Puede comprobar qué comando utiliza Sourcetree para eliminar la etapa de un archivo.
Creé un nuevo archivo y lo agregué a Git. Luego lo quité de escena usando la GUI de Sourcetree.
Este es el resultado:
Desactivar archivos [12/08/15 10:43]
git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree reset -q - ruta / a / archivo / nombrearchivo.java
Sourcetree usa reset para quitar la etapa de nuevos archivos.
|
1
2
Siguiente
Pregunta muy activa. Gana 10 de reputación para responder a esta pregunta. El requisito de reputación ayuda a proteger esta pregunta del spam y de la actividad sin respuesta.
No es la respuesta que estás buscando? Lea otras preguntas en las etiquetas git version-control git-commit git-stage o haga su propia pregunta.